package com.luych.toolbox.data.service.core.dm;

import com.luych.toolbox.common.enums.DataSourceType;
import com.luych.toolbox.data.service.core.CoreDataType;

public enum DmDataType implements CoreDataType {

    BOOL(false, false, false), // 布尔数据类型：TRUE 和 FALSE
    BOOLEAN(false, false, false), // 布尔数据类型：TRUE 和 FALSE

    BIT(false, false, false), // 1字节，用于存储整数数据 1、0 或 NULL

    BYTE(false, false, false), // 1字节，用于存储有符号整数，精度为 3，标度为 0。取值范围为：-128～+127
    TINYINT(false, false, false), // 1字节，用于存储有符号整数，精度为 3，标度为 0。取值范围为：-128～+127
    SMALLINT(false, false, false), // 2字节，用于存储有符号整数，精度为 5，标度为 0。取值范围为：-32,768 ~ 32,767
    INT(false, false, false), // 4字节，用于存储有符号整数，精度为 10，标度为 0。取值范围为：-2147483648(-2^31)～ +2147483647(2^31-1)
    INTEGER(false, false, false), // 4字节，用于存储有符号整数，精度为 10，标度为 0。取值范围为：-2147483648(-2^31)～ +2147483647(2^31-1)
    PLS_INTEGER(false, false, false), // 4字节，用于存储有符号整数，精度为 10，标度为 0。取值范围为：-2147483648(-2^31)～ +2147483647(2^31-1)
    BIGINT(false, false, false), // 8字节，用于存储有符号整数，精度为 19，标度为 0。取值范围为：-9223372036854775808(-2^63)～ 9223372036854775807(2^63-1)

    REAL(false, false, false), // 4字节，带二进制的浮点数，系统指定其二进制精度为 24，十进制精度为 7。取值范围-3.4E + 38 ～ 3.4E + 38。
    FLOAT(false, false, false), // 8字节，带二进制的浮点数，精度最大不超过 53，如省略精度，则二进制精度为 53，十进制精度为 15。取值范围为-1.7E + 308 ～ 1.7E + 308
    DOUBLE(false, false, false), // 8字节，带二进制的浮点数，精度最大不超过 53，如省略精度，则二进制精度为 53，十进制精度为 15。取值范围为-1.7E + 308 ～ 1.7E + 308
    DEC(false, true, true), // 1~20字节，精度范围是 1 至 38，默认是 16。如省略标度，则默认是 0。如果不指定精度和标度，缺省精度为 38
    DECIMAL(false, true, true), // 1~20字节，精度范围是 1 至 38，默认是 16。如省略标度，则默认是 0。如果不指定精度和标度，缺省精度为 38
    NUMERIC(false, true, true), // 1~20字节，精度范围是 1 至 38，默认是 16。如省略标度，则默认是 0。如果不指定精度和标度，缺省精度为 38
    NUMBER(false, true, true), // 1~20字节，精度范围是 1 至 38，默认是 16。如省略标度，则默认是 0。如果不指定精度和标度，缺省精度为 38

    CHAR(true, false, false), // 定长字符串，可以指定一个不超过 32767 的正整数作为字节长度，最大长度由数据库页面大小决定
    CHARACTER(true, false, false), // 定长字符串，可以指定一个不超过 32767 的正整数作为字节长度，最大长度由数据库页面大小决定
    VARCHAR(true, false, false), // 可变长字符串，可以指定一个不超过 32767 的正整数作为字节长度或字符长度，VARCHAR (100)指定 100 字节长度，VARCHAR(100 CHAR)指定 100 字符长度，最大长度由数据库页面大小决定
    VARCHAR2(true, false, false), // 可变长字符串，可以指定一个不超过 32767 的正整数作为字节长度或字符长度，VARCHAR (100)指定 100 字节长度，VARCHAR(100 CHAR)指定 100 字符长度，最大长度由数据库页面大小决定

    BINARY(false, true, false),  // 1~8188字节，定长二进制数据
    VARBINARY(false, true, false), // 1~8188字节，变长二进制数据

    DATE(false, false, false), // 3字节，类型包括年、月、日信息，'-4712-01-01'和'9999-12-31'之间
    TIME(false, true, false), // 5字节，类型包括时、分、秒信息，定义了一个在'00:00:00.000000'和'23:59:59.999999'之间的有效时间。TIME 类型的小数秒精度规定了秒字段中小数点后面的位数，取值范围为 0～6，如果未定义，缺省精度为 0。
    DATETIME(false, true, false), // 8字节，类型包括年、月、日、时、分、秒信息，定义了一个在'-4712-01-01 00:00:00.000000'和'9999-12-31 23:59:59.999999'之间的有效格里高利日期时间。小数秒精度规定了秒字段中小数点后面的位数，取值范围为 0～6，如果未定义，缺省精度为 6。
    TIMESTAMP(false, true, false), // 8字节，类型包括年、月、日、时、分、秒信息，定义了一个在'-4712-01-01 00:00:00.000000'和'9999-12-31 23:59:59.999999'之间的有效格里高利日期时间。小数秒精度规定了秒字段中小数点后面的位数，取值范围为 0～6，如果未定义，缺省精度为 6。

    CLOB(false, false, false), // 为变长的字符串，长度最大为 100G-1 字节。
    TEXT(false, false, false), // 为变长字符串类型。其字符串的长度最大为 100G-1 字节
    LONG(false, false, false), //为变长字符串类型。其字符串的长度最大为 100G-1 字节
    LONGVARCHAR(false, false, false), // 为变长字符串类型。其字符串的长度最大为 100G-1 字节

    BLOB(false, false, false), // 变长的二进制大对象，长度最大为 100G-1 字节。
    IMAGE(false, false, false), // 除了存储图像数据之外，还可用于存储任何其它二进制数据。长度最大为 100G-1 字节
    LONGVARBINARY(false, false, false), // 除了存储图像数据之外，还可用于存储任何其它二进制数据。长度最大为 100G-1 字节

    ;

    private final boolean supportCharLength;
    private final boolean supportNumericPrecision;
    private final boolean supportNumericScale;

    DmDataType(boolean supportCharLength, boolean supportNumericPrecision, boolean supportNumericScale) {
        this.supportCharLength = supportCharLength;
        this.supportNumericPrecision = supportNumericPrecision;
        this.supportNumericScale = supportNumericScale;
    }


    @Override
    public DataSourceType getDataSourceType() {
        return DataSourceType.DM;
    }

    @Override
    public String getName() {
        return this.name();
    }

    @Override
    public boolean supportCharLength() {
        return this.supportCharLength;
    }

    @Override
    public boolean supportNumericPrecision() {
        return this.supportNumericPrecision;
    }

    @Override
    public boolean supportNumericScale() {
        return this.supportNumericScale;
    }
}
